// Copyright 2008 Altera Corporation. All rights reserved.  
// Altera products are protected under numerous U.S. and foreign patents, 
// maskwork rights, copyrights and other intellectual property laws.  
//
// This reference design file, and your use thereof, is subject to and governed
// by the terms and conditions of the applicable Altera Reference Design 
// License Agreement (either as signed by you or found at www.altera.com).  By
// using this reference design file, you indicate your acceptance of such terms
// and conditions between you and Altera Corporation.  In the event that you do
// not agree with such terms and conditions, you may not use the reference 
// design file and please promptly destroy any copies you have made.
//
// This reference design file is being provided on an "as-is" basis and as an 
// accommodation and therefore all warranties, representations or guarantees of 
// any kind (whether express, implied or statutory) including, without 
// limitation, warranties of merchantability, non-infringement, or fitness for
// a particular purpose, are specifically disclaimed.  By making this reference
// design file available, Altera expressly does not recommend, suggest or 
// require that this reference design file be used in combination with any 
// other product not provided by Altera.
/////////////////////////////////////////////////////////////////////////////

//
// 32 bit CRC of 32 data bits (reversed - MSB first)
// polynomial : 1edc6f41 
//    x^28 + x^27 + x^26 + x^25 + x^23 + x^22 + x^20 + x^19 + x^18 + x^14 + x^13 + x^11 + x^10 + x^9 + x^8 + x^6 + x^0
//
//        CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD 
//        00000000001111111111222222222233 00000000001111111111222222222233 
//        01234567890123456789012345678901 01234567890123456789012345678901 
// C00  = #...######..#...###..#.#.####.## #...######..#...###..#.#.####.## 
// C01  = .#...######..#...###..#.#.####.# .#...######..#...###..#.#.####.# 
// C02  = ..#...######..#...###..#.#.####. ..#...######..#...###..#.#.####. 
// C03  = ...#...######..#...###..#.#.#### ...#...######..#...###..#.#.#### 
// C04  = ....#...######..#...###..#.#.### ....#...######..#...###..#.#.### 
// C05  = .....#...######..#...###..#.#.## .....#...######..#...###..#.#.## 
// C06  = #...##.#####.#####...##.###.###. #...##.#####.#####...##.###.###. 
// C07  = .#...##.#####.#####...##.###.### .#...##.#####.#####...##.###.### 
// C08  = #.#.##..#.##.#.#...#.#..##...... #.#.##..#.##.#.#...#.#..##...... 
// C09  = ##.##..##..#..#..##.####...##.## ##.##..##..#..#..##.####...##.## 
// C10  = ###...##.......###.#..#.####.##. ###...##.......###.#..#.####.##. 
// C11  = #######..#..#.......##.......... #######..#..#.......##.......... 
// C12  = .#######..#..#.......##......... .#######..#..#.......##......... 
// C13  = #.##.....#.##.#.###..##..####.## #.##.....#.##.#.###..##..####.## 
// C14  = ##.#.######..#.##..#.##..#...##. ##.#.######..#.##..#.##..#...##. 
// C15  = .##.#.######..#.##..#.##..#...## .##.#.######..#.##..#.##..#...## 
// C16  = ..##.#.######..#.##..#.##..#...# ..##.#.######..#.##..#.##..#...# 
// C17  = ...##.#.######..#.##..#.##..#... ...##.#.######..#.##..#.##..#... 
// C18  = #.....#.#.##.##.#.####.....##### #.....#.#.##.##.#.####.....##### 
// C19  = ##..###.#..#..###.###.##.###.#.. ##..###.#..#..###.###.##.###.#.. 
// C20  = ###.#...#......#..###...##.....# ###.#...#......#..###...##.....# 
// C21  = .###.#...#......#..###...##..... .###.#...#......#..###...##..... 
// C22  = #.##.#.####.#...#.#.#.##.#..#.## #.##.#.####.#...#.#.#.##.#..#.## 
// C23  = ##.#.#.#..####..#.##....##.####. ##.#.#.#..####..#.##....##.####. 
// C24  = .##.#.#.#..####..#.##....##.#### .##.#.#.#..####..#.##....##.#### 
// C25  = #.###.#.#....#####..#..#.#..##.. #.###.#.#....#####..#..#.#..##.. 
// C26  = ##.#..#.#...#.##.......###.###.# ##.#..#.#...#.##.......###.###.# 
// C27  = ###..##.#...##.#.##..#.##..#.#.# ###..##.#...##.#.##..#.##..#.#.# 
// C28  = ######..#...###..#.#.####.##...# ######..#...###..#.#.####.##...# 
// C29  = .######..#...###..#.#.####.##... .######..#...###..#.#.####.##... 
// C30  = ..######..#...###..#.#.####.##.. ..######..#...###..#.#.####.##.. 
// C31  = ...######..#...###..#.#.####.##. ...######..#...###..#.#.####.##. 
//
// Number of XORs used is 32
// Total XOR inputs 1068
//
module crc32c_dat32 (
	input[31:0] crc_in,
	input[31:0] dat_in,
	output[31:0] crc_out
);

parameter METHOD = 1;

generate
  if (METHOD == 0)
    crc32c_dat32_flat cc (.c(crc_in),.d(dat_in),.crc_out(crc_out));
  else
    crc32c_dat32_factor cc (.c(crc_in),.d(dat_in),.crc_out(crc_out));
endgenerate

endmodule


module crc32c_dat32_flat (c,d,crc_out);
input[31:0] c;
input[31:0] d;
output[31:0] crc_out;
wire[31:0] crc_out;

assign crc_out[0] =
    c[0] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ 
    c[9] ^ c[12] ^ c[16] ^ c[17] ^ c[18] ^ c[21] ^ c[23] ^ 
    c[25] ^ c[26] ^ c[27] ^ c[28] ^ c[30] ^ c[31] ^ d[31] ^ 
    d[30] ^ d[28] ^ d[27] ^ d[26] ^ d[25] ^ d[23] ^ d[21] ^ 
    d[18] ^ d[17] ^ d[16] ^ d[12] ^ d[9] ^ d[8] ^ d[7] ^ 
    d[6] ^ d[5] ^ d[4] ^ d[0];

assign crc_out[1] =
    c[1] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ 
    c[10] ^ c[13] ^ c[17] ^ c[18] ^ c[19] ^ c[22] ^ c[24] ^ 
    c[26] ^ c[27] ^ c[28] ^ c[29] ^ c[31] ^ d[31] ^ d[29] ^ 
    d[28] ^ d[27] ^ d[26] ^ d[24] ^ d[22] ^ d[19] ^ d[18] ^ 
    d[17] ^ d[13] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ 
    d[5] ^ d[1];

assign crc_out[2] =
    c[2] ^ c[6] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ 
    c[11] ^ c[14] ^ c[18] ^ c[19] ^ c[20] ^ c[23] ^ c[25] ^ 
    c[27] ^ c[28] ^ c[29] ^ c[30] ^ d[30] ^ d[29] ^ d[28] ^ 
    d[27] ^ d[25] ^ d[23] ^ d[20] ^ d[19] ^ d[18] ^ d[14] ^ 
    d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[2];

assign crc_out[3] =
    c[3] ^ c[7] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ 
    c[12] ^ c[15] ^ c[19] ^ c[20] ^ c[21] ^ c[24] ^ c[26] ^ 
    c[28] ^ c[29] ^ c[30] ^ c[31] ^ d[31] ^ d[30] ^ d[29] ^ 
    d[28] ^ d[26] ^ d[24] ^ d[21] ^ d[20] ^ d[19] ^ d[15] ^ 
    d[12] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[3];

assign crc_out[4] =
    c[4] ^ c[8] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ 
    c[13] ^ c[16] ^ c[20] ^ c[21] ^ c[22] ^ c[25] ^ c[27] ^ 
    c[29] ^ c[30] ^ c[31] ^ d[31] ^ d[30] ^ d[29] ^ d[27] ^ 
    d[25] ^ d[22] ^ d[21] ^ d[20] ^ d[16] ^ d[13] ^ d[12] ^ 
    d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[4];

assign crc_out[5] =
    c[5] ^ c[9] ^ c[10] ^ c[11] ^ c[12] ^ c[13] ^ 
    c[14] ^ c[17] ^ c[21] ^ c[22] ^ c[23] ^ c[26] ^ c[28] ^ 
    c[30] ^ c[31] ^ d[31] ^ d[30] ^ d[28] ^ d[26] ^ d[23] ^ 
    d[22] ^ d[21] ^ d[17] ^ d[14] ^ d[13] ^ d[12] ^ d[11] ^ 
    d[10] ^ d[9] ^ d[5];

assign crc_out[6] =
    c[0] ^ c[4] ^ c[5] ^ c[7] ^ c[8] ^ c[9] ^ 
    c[10] ^ c[11] ^ c[13] ^ c[14] ^ c[15] ^ c[16] ^ c[17] ^ 
    c[21] ^ c[22] ^ c[24] ^ c[25] ^ c[26] ^ c[28] ^ c[29] ^ 
    c[30] ^ d[30] ^ d[29] ^ d[28] ^ d[26] ^ d[25] ^ d[24] ^ 
    d[22] ^ d[21] ^ d[17] ^ d[16] ^ d[15] ^ d[14] ^ d[13] ^ 
    d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[5] ^ d[4] ^ 
    d[0];

assign crc_out[7] =
    c[1] ^ c[5] ^ c[6] ^ c[8] ^ c[9] ^ c[10] ^ 
    c[11] ^ c[12] ^ c[14] ^ c[15] ^ c[16] ^ c[17] ^ c[18] ^ 
    c[22] ^ c[23] ^ c[25] ^ c[26] ^ c[27] ^ c[29] ^ c[30] ^ 
    c[31] ^ d[31] ^ d[30] ^ d[29] ^ d[27] ^ d[26] ^ d[25] ^ 
    d[23] ^ d[22] ^ d[18] ^ d[17] ^ d[16] ^ d[15] ^ d[14] ^ 
    d[12] ^ d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[6] ^ d[5] ^ 
    d[1];

assign crc_out[8] =
    c[0] ^ c[2] ^ c[4] ^ c[5] ^ c[8] ^ c[10] ^ 
    c[11] ^ c[13] ^ c[15] ^ c[19] ^ c[21] ^ c[24] ^ c[25] ^ 
    d[25] ^ d[24] ^ d[21] ^ d[19] ^ d[15] ^ d[13] ^ d[11] ^ 
    d[10] ^ d[8] ^ d[5] ^ d[4] ^ d[2] ^ d[0];

assign crc_out[9] =
    c[0] ^ c[1] ^ c[3] ^ c[4] ^ c[7] ^ c[8] ^ 
    c[11] ^ c[14] ^ c[17] ^ c[18] ^ c[20] ^ c[21] ^ c[22] ^ 
    c[23] ^ c[27] ^ c[28] ^ c[30] ^ c[31] ^ d[31] ^ d[30] ^ 
    d[28] ^ d[27] ^ d[23] ^ d[22] ^ d[21] ^ d[20] ^ d[18] ^ 
    d[17] ^ d[14] ^ d[11] ^ d[8] ^ d[7] ^ d[4] ^ d[3] ^ 
    d[1] ^ d[0];

assign crc_out[10] =
    c[0] ^ c[1] ^ c[2] ^ c[6] ^ c[7] ^ c[15] ^ 
    c[16] ^ c[17] ^ c[19] ^ c[22] ^ c[24] ^ c[25] ^ c[26] ^ 
    c[27] ^ c[29] ^ c[30] ^ d[30] ^ d[29] ^ d[27] ^ d[26] ^ 
    d[25] ^ d[24] ^ d[22] ^ d[19] ^ d[17] ^ d[16] ^ d[15] ^ 
    d[7] ^ d[6] ^ d[2] ^ d[1] ^ d[0];

assign crc_out[11] =
    c[0] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ 
    c[6] ^ c[9] ^ c[12] ^ c[20] ^ c[21] ^ d[21] ^ d[20] ^ 
    d[12] ^ d[9] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ d[2] ^ 
    d[1] ^ d[0];

assign crc_out[12] =
    c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ 
    c[7] ^ c[10] ^ c[13] ^ c[21] ^ c[22] ^ d[22] ^ d[21] ^ 
    d[13] ^ d[10] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ 
    d[2] ^ d[1];

assign crc_out[13] =
    c[0] ^ c[2] ^ c[3] ^ c[9] ^ c[11] ^ c[12] ^ 
    c[14] ^ c[16] ^ c[17] ^ c[18] ^ c[21] ^ c[22] ^ c[25] ^ 
    c[26] ^ c[27] ^ c[28] ^ c[30] ^ c[31] ^ d[31] ^ d[30] ^ 
    d[28] ^ d[27] ^ d[26] ^ d[25] ^ d[22] ^ d[21] ^ d[18] ^ 
    d[17] ^ d[16] ^ d[14] ^ d[12] ^ d[11] ^ d[9] ^ d[3] ^ 
    d[2] ^ d[0];

assign crc_out[14] =
    c[0] ^ c[1] ^ c[3] ^ c[5] ^ c[6] ^ c[7] ^ 
    c[8] ^ c[9] ^ c[10] ^ c[13] ^ c[15] ^ c[16] ^ c[19] ^ 
    c[21] ^ c[22] ^ c[25] ^ c[29] ^ c[30] ^ d[30] ^ d[29] ^ 
    d[25] ^ d[22] ^ d[21] ^ d[19] ^ d[16] ^ d[15] ^ d[13] ^ 
    d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ d[3] ^ 
    d[1] ^ d[0];

assign crc_out[15] =
    c[1] ^ c[2] ^ c[4] ^ c[6] ^ c[7] ^ c[8] ^ 
    c[9] ^ c[10] ^ c[11] ^ c[14] ^ c[16] ^ c[17] ^ c[20] ^ 
    c[22] ^ c[23] ^ c[26] ^ c[30] ^ c[31] ^ d[31] ^ d[30] ^ 
    d[26] ^ d[23] ^ d[22] ^ d[20] ^ d[17] ^ d[16] ^ d[14] ^ 
    d[11] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[6] ^ d[4] ^ 
    d[2] ^ d[1];

assign crc_out[16] =
    c[2] ^ c[3] ^ c[5] ^ c[7] ^ c[8] ^ c[9] ^ 
    c[10] ^ c[11] ^ c[12] ^ c[15] ^ c[17] ^ c[18] ^ c[21] ^ 
    c[23] ^ c[24] ^ c[27] ^ c[31] ^ d[31] ^ d[27] ^ d[24] ^ 
    d[23] ^ d[21] ^ d[18] ^ d[17] ^ d[15] ^ d[12] ^ d[11] ^ 
    d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[5] ^ d[3] ^ d[2];

assign crc_out[17] =
    c[3] ^ c[4] ^ c[6] ^ c[8] ^ c[9] ^ c[10] ^ 
    c[11] ^ c[12] ^ c[13] ^ c[16] ^ c[18] ^ c[19] ^ c[22] ^ 
    c[24] ^ c[25] ^ c[28] ^ d[28] ^ d[25] ^ d[24] ^ d[22] ^ 
    d[19] ^ d[18] ^ d[16] ^ d[13] ^ d[12] ^ d[11] ^ d[10] ^ 
    d[9] ^ d[8] ^ d[6] ^ d[4] ^ d[3];

assign crc_out[18] =
    c[0] ^ c[6] ^ c[8] ^ c[10] ^ c[11] ^ c[13] ^ 
    c[14] ^ c[16] ^ c[18] ^ c[19] ^ c[20] ^ c[21] ^ c[27] ^ 
    c[28] ^ c[29] ^ c[30] ^ c[31] ^ d[31] ^ d[30] ^ d[29] ^ 
    d[28] ^ d[27] ^ d[21] ^ d[20] ^ d[19] ^ d[18] ^ d[16] ^ 
    d[14] ^ d[13] ^ d[11] ^ d[10] ^ d[8] ^ d[6] ^ d[0];

assign crc_out[19] =
    c[0] ^ c[1] ^ c[4] ^ c[5] ^ c[6] ^ c[8] ^ 
    c[11] ^ c[14] ^ c[15] ^ c[16] ^ c[18] ^ c[19] ^ c[20] ^ 
    c[22] ^ c[23] ^ c[25] ^ c[26] ^ c[27] ^ c[29] ^ d[29] ^ 
    d[27] ^ d[26] ^ d[25] ^ d[23] ^ d[22] ^ d[20] ^ d[19] ^ 
    d[18] ^ d[16] ^ d[15] ^ d[14] ^ d[11] ^ d[8] ^ d[6] ^ 
    d[5] ^ d[4] ^ d[1] ^ d[0];

assign crc_out[20] =
    c[0] ^ c[1] ^ c[2] ^ c[4] ^ c[8] ^ c[15] ^ 
    c[18] ^ c[19] ^ c[20] ^ c[24] ^ c[25] ^ c[31] ^ d[31] ^ 
    d[25] ^ d[24] ^ d[20] ^ d[19] ^ d[18] ^ d[15] ^ d[8] ^ 
    d[4] ^ d[2] ^ d[1] ^ d[0];

assign crc_out[21] =
    c[1] ^ c[2] ^ c[3] ^ c[5] ^ c[9] ^ c[16] ^ 
    c[19] ^ c[20] ^ c[21] ^ c[25] ^ c[26] ^ d[26] ^ d[25] ^ 
    d[21] ^ d[20] ^ d[19] ^ d[16] ^ d[9] ^ d[5] ^ d[3] ^ 
    d[2] ^ d[1];

assign crc_out[22] =
    c[0] ^ c[2] ^ c[3] ^ c[5] ^ c[7] ^ c[8] ^ 
    c[9] ^ c[10] ^ c[12] ^ c[16] ^ c[18] ^ c[20] ^ c[22] ^ 
    c[23] ^ c[25] ^ c[28] ^ c[30] ^ c[31] ^ d[31] ^ d[30] ^ 
    d[28] ^ d[25] ^ d[23] ^ d[22] ^ d[20] ^ d[18] ^ d[16] ^ 
    d[12] ^ d[10] ^ d[9] ^ d[8] ^ d[7] ^ d[5] ^ d[3] ^ 
    d[2] ^ d[0];

assign crc_out[23] =
    c[0] ^ c[1] ^ c[3] ^ c[5] ^ c[7] ^ c[10] ^ 
    c[11] ^ c[12] ^ c[13] ^ c[16] ^ c[18] ^ c[19] ^ c[24] ^ 
    c[25] ^ c[27] ^ c[28] ^ c[29] ^ c[30] ^ d[30] ^ d[29] ^ 
    d[28] ^ d[27] ^ d[25] ^ d[24] ^ d[19] ^ d[18] ^ d[16] ^ 
    d[13] ^ d[12] ^ d[11] ^ d[10] ^ d[7] ^ d[5] ^ d[3] ^ 
    d[1] ^ d[0];

assign crc_out[24] =
    c[1] ^ c[2] ^ c[4] ^ c[6] ^ c[8] ^ c[11] ^ 
    c[12] ^ c[13] ^ c[14] ^ c[17] ^ c[19] ^ c[20] ^ c[25] ^ 
    c[26] ^ c[28] ^ c[29] ^ c[30] ^ c[31] ^ d[31] ^ d[30] ^ 
    d[29] ^ d[28] ^ d[26] ^ d[25] ^ d[20] ^ d[19] ^ d[17] ^ 
    d[14] ^ d[13] ^ d[12] ^ d[11] ^ d[8] ^ d[6] ^ d[4] ^ 
    d[2] ^ d[1];

assign crc_out[25] =
    c[0] ^ c[2] ^ c[3] ^ c[4] ^ c[6] ^ c[8] ^ 
    c[13] ^ c[14] ^ c[15] ^ c[16] ^ c[17] ^ c[20] ^ c[23] ^ 
    c[25] ^ c[28] ^ c[29] ^ d[29] ^ d[28] ^ d[25] ^ d[23] ^ 
    d[20] ^ d[17] ^ d[16] ^ d[15] ^ d[14] ^ d[13] ^ d[8] ^ 
    d[6] ^ d[4] ^ d[3] ^ d[2] ^ d[0];

assign crc_out[26] =
    c[0] ^ c[1] ^ c[3] ^ c[6] ^ c[8] ^ c[12] ^ 
    c[14] ^ c[15] ^ c[23] ^ c[24] ^ c[25] ^ c[27] ^ c[28] ^ 
    c[29] ^ c[31] ^ d[31] ^ d[29] ^ d[28] ^ d[27] ^ d[25] ^ 
    d[24] ^ d[23] ^ d[15] ^ d[14] ^ d[12] ^ d[8] ^ d[6] ^ 
    d[3] ^ d[1] ^ d[0];

assign crc_out[27] =
    c[0] ^ c[1] ^ c[2] ^ c[5] ^ c[6] ^ c[8] ^ 
    c[12] ^ c[13] ^ c[15] ^ c[17] ^ c[18] ^ c[21] ^ c[23] ^ 
    c[24] ^ c[27] ^ c[29] ^ c[31] ^ d[31] ^ d[29] ^ d[27] ^ 
    d[24] ^ d[23] ^ d[21] ^ d[18] ^ d[17] ^ d[15] ^ d[13] ^ 
    d[12] ^ d[8] ^ d[6] ^ d[5] ^ d[2] ^ d[1] ^ d[0];

assign crc_out[28] =
    c[0] ^ c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ 
    c[8] ^ c[12] ^ c[13] ^ c[14] ^ c[17] ^ c[19] ^ c[21] ^ 
    c[22] ^ c[23] ^ c[24] ^ c[26] ^ c[27] ^ c[31] ^ d[31] ^ 
    d[27] ^ d[26] ^ d[24] ^ d[23] ^ d[22] ^ d[21] ^ d[19] ^ 
    d[17] ^ d[14] ^ d[13] ^ d[12] ^ d[8] ^ d[5] ^ d[4] ^ 
    d[3] ^ d[2] ^ d[1] ^ d[0];

assign crc_out[29] =
    c[1] ^ c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ 
    c[9] ^ c[13] ^ c[14] ^ c[15] ^ c[18] ^ c[20] ^ c[22] ^ 
    c[23] ^ c[24] ^ c[25] ^ c[27] ^ c[28] ^ d[28] ^ d[27] ^ 
    d[25] ^ d[24] ^ d[23] ^ d[22] ^ d[20] ^ d[18] ^ d[15] ^ 
    d[14] ^ d[13] ^ d[9] ^ d[6] ^ d[5] ^ d[4] ^ d[3] ^ 
    d[2] ^ d[1];

assign crc_out[30] =
    c[2] ^ c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ 
    c[10] ^ c[14] ^ c[15] ^ c[16] ^ c[19] ^ c[21] ^ c[23] ^ 
    c[24] ^ c[25] ^ c[26] ^ c[28] ^ c[29] ^ d[29] ^ d[28] ^ 
    d[26] ^ d[25] ^ d[24] ^ d[23] ^ d[21] ^ d[19] ^ d[16] ^ 
    d[15] ^ d[14] ^ d[10] ^ d[7] ^ d[6] ^ d[5] ^ d[4] ^ 
    d[3] ^ d[2];

assign crc_out[31] =
    c[3] ^ c[4] ^ c[5] ^ c[6] ^ c[7] ^ c[8] ^ 
    c[11] ^ c[15] ^ c[16] ^ c[17] ^ c[20] ^ c[22] ^ c[24] ^ 
    c[25] ^ c[26] ^ c[27] ^ c[29] ^ c[30] ^ d[30] ^ d[29] ^ 
    d[27] ^ d[26] ^ d[25] ^ d[24] ^ d[22] ^ d[20] ^ d[17] ^ 
    d[16] ^ d[15] ^ d[11] ^ d[8] ^ d[7] ^ d[6] ^ d[5] ^ 
    d[4] ^ d[3];

endmodule


module crc32c_dat32_factor (c,d,crc_out);
input[31:0] c;
input[31:0] d;
output[31:0] crc_out;
wire[31:0] crc_out;

wire[90:0] h ;

xor6 cx_0 (crc_out[0],    h[12] , h[36] , h[38] , h[42] , h[50] , h[51]);
xor6 cx_1 (crc_out[1],    h[5] , h[18] , h[20] , h[24] , h[37] , h[53]);
xor6 cx_2 (crc_out[2],    h[8] , h[21] , h[31] , h[55] , h[56] , h[57]);
xor6 cx_3 (crc_out[3],    h[13] , h[20] , h[21] , h[37] , h[43] , h[62]);
xor6 cx_4 (crc_out[4],    h[21] , h[23] , h[34] , h[43] , h[44] , h[55]);
xor6 cx_5 (crc_out[5],    h[1] , h[7] , h[9] , h[29] , h[38] , h[44]);
xor6 cx_6 (crc_out[6],    h[26] , h[29] , h[34] , h[44] , h[55] , h[63]);
xor6 cx_7 (crc_out[7],    h[11] , h[18] , h[28] , h[45] , h[55] , h[70]);
xor6 cx_8 (crc_out[8],    h[3] , h[10] , h[33] , h[75] , h[76] , 1'b0);
xor6 cx_9 (crc_out[9],    h[18] , h[28] , h[35] , h[41] , h[78] , h[82]);
xor6 cx_10 (crc_out[10],    h[17] , h[24] , h[33] , h[36] , h[89] , h[90]);
xor6 cx_11 (crc_out[11],    h[16] , h[21] , h[30] , h[38] , h[88] , 1'b0);
xor6 cx_12 (crc_out[12],    h[13] , h[15] , h[30] , h[81] , h[87] , 1'b0);
xor6 cx_13 (crc_out[13],    h[16] , h[25] , h[36] , h[40] , h[85] , h[86]);
xor6 cx_14 (crc_out[14],    h[17] , h[44] , h[48] , h[83] , h[84] , 1'b0);
xor6 cx_15 (crc_out[15],    h[21] , h[31] , h[39] , h[71] , h[80] , h[81]);
xor6 cx_16 (crc_out[16],    h[33] , h[40] , h[42] , h[79] , h[82] , 1'b0);
xor6 cx_17 (crc_out[17],    h[20] , h[32] , h[40] , h[66] , h[77] , 1'b0);
xor6 cx_18 (crc_out[18],    h[19] , h[23] , h[27] , h[71] , h[73] , h[74]);
xor6 cx_19 (crc_out[19],    h[11] , h[17] , h[41] , h[45] , h[72] , h[81]);
xor6 cx_20 (crc_out[20],    c[18] , h[3] , h[17] , h[33] , h[69] , h[71]);
xor6 cx_21 (crc_out[21],    h[21] , h[22] , h[38] , h[45] , h[68] , 1'b0);
xor6 cx_22 (crc_out[22],    h[9] , h[25] , h[27] , h[31] , h[66] , h[67]);
xor6 cx_23 (crc_out[23],    h[6] , h[17] , h[19] , h[25] , h[64] , h[65]);
xor6 cx_24 (crc_out[24],    h[15] , h[30] , h[35] , h[41] , h[43] , h[61]);
xor6 cx_25 (crc_out[25],    h[14] , h[25] , h[27] , h[28] , h[33] , h[60]);
xor6 cx_26 (crc_out[26],    h[8] , h[25] , h[26] , h[30] , h[43] , h[59]);
xor6 cx_27 (crc_out[27],    h[5] , h[11] , h[16] , h[19] , h[39] , h[58]);
xor6 cx_28 (crc_out[28],    h[15] , h[17] , h[28] , h[32] , h[54] , h[81]);
xor6 cx_29 (crc_out[29],    h[11] , h[15] , h[18] , h[21] , h[25] , h[52]);
xor6 cx_30 (crc_out[30],    h[20] , h[22] , h[28] , h[45] , h[48] , h[49]);
xor6 cx_31 (crc_out[31],    h[14] , h[36] , h[41] , h[46] , h[47] , h[81]);
xor6 hx_0 (h[0],    c[8] , c[25] , c[29] , d[29] , d[25] , d[8]);   // used by 7
xor6 hx_1 (h[1],    c[10] , c[11] , c[30] , d[30] , d[11] , d[10]);   // used by 7
xor6 hx_2 (h[2],    c[16] , c[22] , c[25] , d[25] , d[22] , d[16]);   // used by 3
xor6 hx_3 (h[3],    c[4] , c[8] , c[25] , d[25] , d[8] , d[4]);   // used by 4
xor6 hx_4 (h[4],    c[8] , c[9] , c[10] , d[10] , d[9] , d[8]);   // used by 4
xor6 hx_5 (h[5],    c[17] , c[27] , c[31] , d[31] , d[27] , d[17]);   // used by 8
xor6 hx_6 (h[6],    c[5] , c[24] , c[27] , d[27] , d[24] , d[5]);   // used by 3
xor6 hx_7 (h[7],    c[14] , c[17] , c[26] , d[26] , d[17] , d[14]);   // used by 4
xor6 hx_8 (h[8],    c[14] , c[23] , c[27] , d[27] , d[23] , d[14]);   // used by 5
xor6 hx_9 (h[9],    c[12] , c[23] , c[31] , d[31] , d[23] , d[12]);   // used by 4
xor6 hx_10 (h[10],    c[5] , c[21] , c[24] , d[24] , d[21] , d[5]);   // used by 5
xor6 hx_11 (h[11],    c[5] , c[6] , c[15] , d[15] , d[6] , d[5]);   // used by 5
xor6 hx_12 (h[12],    c[6] , c[16] , c[28] , d[28] , d[16] , d[6]);   // used by 2
xor6 hx_13 (h[13],    c[3] , c[7] , c[21] , d[21] , d[7] , d[3]);   // used by 5
xor6 hx_14 (h[14],    c[4] , c[6] , c[16] , d[16] , d[6] , d[4]);   // used by 5
xor6 hx_15 (h[15],    c[2] , c[4] , c[13] , d[13] , d[4] , d[2]);   // used by 4
xor6 hx_16 (h[16],    c[0] , c[2] , c[12] , d[12] , d[2] , d[0]);   // used by 3
xor6 hx_17 (h[17],    c[0] , c[1] , c[19] , d[19] , d[1] , d[0]);   // used by 7
xor6 hx_18 (h[18],    c[1] , c[18] , c[22] , d[22] , d[18] , d[1]);   // used by 4
xor6 hx_19 (h[19],    c[13] , c[18] , c[29] , d[29] , d[18] , d[13]);   // used by 3
xor6 hx_20 (h[20],    c[19] , c[24] , c[28] , d[28] , d[24] , d[19]);   // used by 4
xor6 hx_21 (h[21],    c[9] , c[20] , d[20] , d[9] , 1'b0 , 1'b0);   // used by 7
xor6 hx_22 (h[22],    c[2] , c[25] , d[25] , d[2] , 1'b0 , 1'b0);   // used by 2
xor6 hx_23 (h[23],    c[21] , c[27] , d[27] , d[21] , 1'b0 , 1'b0);   // used by 2
xor6 hx_24 (h[24],    c[6] , c[7] , d[7] , d[6] , 1'b0 , 1'b0);   // used by 2
xor6 hx_25 (h[25],    c[3] , c[28] , d[28] , d[3] , 1'b0 , 1'b0);   // used by 6
xor6 hx_26 (h[26],    c[0] , c[15] , d[15] , d[0] , 1'b0 , 1'b0);   // used by 2
xor6 hx_27 (h[27],    c[0] , c[20] , d[20] , d[0] , 1'b0 , 1'b0);   // used by 3
xor6 hx_28 (h[28],    c[27] , d[27] , h[8] , 1'b0 , 1'b0 , 1'b0);   // used by 5
xor6 hx_29 (h[29],    c[9] , c[28] , d[28] , d[9] , 1'b0 , 1'b0);   // used by 2
xor6 hx_30 (h[30],    c[1] , c[6] , d[6] , d[1] , 1'b0 , 1'b0);   // used by 4
xor6 hx_31 (h[31],    c[2] , c[7] , d[7] , d[2] , 1'b0 , 1'b0);   // used by 3
xor6 hx_32 (h[32],    c[3] , c[12] , d[12] , d[3] , 1'b0 , 1'b0);   // used by 2
xor6 hx_33 (h[33],    c[2] , c[15] , d[15] , d[2] , 1'b0 , 1'b0);   // used by 5
xor6 hx_34 (h[34],    c[6] , d[6] , h[14] , 1'b0 , 1'b0 , 1'b0);   // used by 2
xor6 hx_35 (h[35],    c[28] , c[30] , d[30] , d[28] , 1'b0 , 1'b0);   // used by 2
xor6 hx_36 (h[36],    c[26] , c[30] , d[30] , d[26] , 1'b0 , 1'b0);   // used by 4
xor6 hx_37 (h[37],    c[26] , c[29] , d[29] , d[26] , 1'b0 , 1'b0);   // used by 2
xor6 hx_38 (h[38],    c[24] , d[24] , h[10] , 1'b0 , 1'b0 , 1'b0);   // used by 4
xor6 hx_39 (h[39],    c[8] , c[23] , d[23] , d[8] , 1'b0 , 1'b0);   // used by 2
xor6 hx_40 (h[40],    c[11] , c[18] , d[18] , d[11] , 1'b0 , 1'b0);   // used by 3
xor6 hx_41 (h[41],    c[11] , c[20] , d[20] , d[11] , 1'b0 , 1'b0);   // used by 4
xor6 hx_42 (h[42],    c[31] , d[31] , h[9] , 1'b0 , 1'b0 , 1'b0);   // used by 2
xor6 hx_43 (h[43],    c[23] , d[23] , h[9] , 1'b0 , 1'b0 , 1'b0);   // used by 4
xor6 hx_44 (h[44],    c[13] , c[22] , d[22] , d[13] , 1'b0 , 1'b0);   // used by 4
xor6 hx_45 (h[45],    c[16] , c[26] , d[26] , d[16] , 1'b0 , 1'b0);   // used by 4
xor6 hx_46 (h[46],    c[17] , d[17] , h[0] , h[6] , 1'b0 , 1'b0);   // used by 1
xor6 hx_47 (h[47],    c[15] , c[21] , d[21] , d[15] , h[13] , 1'b0);   // used by 1
xor6 hx_48 (h[48],    h[11] , h[13] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 2
xor6 hx_49 (h[49],    c[4] , c[10] , c[29] , d[29] , d[10] , d[4]);   // used by 1
xor6 hx_50 (h[50],    c[0] , c[7] , c[9] , d[9] , d[7] , d[0]);   // used by 1
xor6 hx_51 (h[51],    c[18] , d[18] , h[3] , h[5] , 1'b0 , 1'b0);   // used by 1
xor6 hx_52 (h[52],    c[24] , c[25] , d[25] , d[24] , h[8] , 1'b0);   // used by 1
xor6 hx_53 (h[53],    c[5] , c[13] , d[13] , d[5] , h[4] , 1'b0);   // used by 1
xor6 hx_54 (h[54],    c[8] , c[26] , d[26] , d[8] , h[5] , h[10]);   // used by 1
xor6 hx_55 (h[55],    h[0] , h[1] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 4
xor6 hx_56 (h[56],    c[6] , c[18] , c[19] , d[19] , d[18] , d[6]);   // used by 1
xor6 hx_57 (h[57],    c[28] , d[28] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 1
xor6 hx_58 (h[58],    c[1] , c[5] , d[5] , d[1] , h[10] , 1'b0);   // used by 1
xor6 hx_59 (h[59],    c[24] , d[24] , h[0] , 1'b0 , 1'b0 , 1'b0);   // used by 1
xor6 hx_60 (h[60],    c[13] , c[17] , d[17] , d[13] , h[0] , 1'b0);   // used by 1
xor6 hx_61 (h[61],    c[19] , d[19] , h[0] , h[7] , 1'b0 , 1'b0);   // used by 1
xor6 hx_62 (h[62],    c[8] , c[15] , d[15] , d[8] , h[1] , 1'b0);   // used by 1
xor6 hx_63 (h[63],    c[7] , d[7] , h[7] , h[10] , 1'b0 , 1'b0);   // used by 1
xor6 hx_64 (h[64],    c[25] , d[25] , h[1] , 1'b0 , 1'b0 , 1'b0);   // used by 1
xor6 hx_65 (h[65],    c[7] , c[12] , c[16] , d[16] , d[12] , d[7]);   // used by 1
xor6 hx_66 (h[66],    h[2] , h[4] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 2
xor6 hx_67 (h[67],    c[5] , c[18] , c[30] , d[30] , d[18] , d[5]);   // used by 1
xor6 hx_68 (h[68],    c[0] , c[3] , d[3] , d[0] , h[17] , 1'b0);   // used by 1
xor6 hx_69 (h[69],    c[20] , c[24] , d[24] , d[20] , d[18] , 1'b0);   // used by 1
xor6 hx_70 (h[70],    c[9] , c[12] , d[12] , d[9] , h[5] , 1'b0);   // used by 1
xor6 hx_71 (h[71],    c[31] , d[31] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 3
xor6 hx_72 (h[72],    c[4] , c[18] , d[18] , d[4] , h[0] , h[8]);   // used by 1
xor6 hx_73 (h[73],    h[1] , h[12] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 1
xor6 hx_74 (h[74],    c[8] , c[14] , c[19] , d[19] , d[14] , d[8]);   // used by 1
xor6 hx_75 (h[75],    c[0] , c[30] , d[30] , d[0] , h[1] , 1'b0);   // used by 1
xor6 hx_76 (h[76],    c[13] , c[19] , d[19] , d[13] , 1'b0 , 1'b0);   // used by 1
xor6 hx_77 (h[77],    c[13] , c[16] , d[16] , d[13] , h[14] , 1'b0);   // used by 1
xor6 hx_78 (h[78],    c[0] , c[25] , d[25] , d[0] , h[3] , 1'b0);   // used by 1
xor6 hx_79 (h[79],    c[27] , d[27] , h[4] , h[6] , 1'b0 , 1'b0);   // used by 1
xor6 hx_80 (h[80],    c[1] , d[1] , h[1] , h[7] , h[14] , 1'b0);   // used by 1
xor6 hx_81 (h[81],    c[22] , d[22] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 5
xor6 hx_82 (h[82],    h[5] , h[13] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 2
xor6 hx_83 (h[83],    c[30] , d[30] , h[0] , 1'b0 , 1'b0 , 1'b0);   // used by 1
xor6 hx_84 (h[84],    c[8] , c[16] , d[16] , d[8] , h[4] , 1'b0);   // used by 1
xor6 hx_85 (h[85],    h[2] , h[5] , 1'b0 , 1'b0 , 1'b0 , 1'b0);   // used by 1
xor6 hx_86 (h[86],    c[9] , c[14] , c[21] , d[21] , d[14] , d[9]);   // used by 1
xor6 hx_87 (h[87],    c[5] , c[10] , d[10] , d[5] , 1'b0 , 1'b0);   // used by 1
xor6 hx_88 (h[88],    c[3] , c[4] , d[4] , d[3] , 1'b0 , 1'b0);   // used by 1
xor6 hx_89 (h[89],    c[29] , d[29] , h[2] , 1'b0 , 1'b0 , 1'b0);   // used by 1
xor6 hx_90 (h[90],    c[24] , c[31] , d[31] , d[24] , h[5] , 1'b0);   // used by 1
endmodule


